package study.activiti.ssh.utils;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.apache.struts2.ServletActionContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import study.activiti.ssh.domain.Employee;
import study.activiti.ssh.service.IEmployeeService;

/**  
* @Name: HelloWorld
* @Description: 任务监听类：监听任务的执行，当流程执行到当前任务节点时，为其分配任务的办理人
* @Author: 李超
* @Create Date: 2016-12-11
*/
@SuppressWarnings("serial")
public class ManagerTaskHandler implements TaskListener {

	public void notify(DelegateTask delegateTask) {
		//从session中获取当前用户
		Employee employee = SessionContext.get() ;
		//获取当前用户名
		String name = employee.getName() ;
		//获取当前用户的领导，即下一个任务节点的办理人，因为session中并没有存放领导对象，会出现懒加载异常
		//Employee manager = employee.getManager() ;
		//String assignee = manager.getName() ;
		//设置任务的办理人
		//delegateTask.setAssignee(assignee) ;
		//解决方案：
		//方式一：在登录的时候就初始化和当前用户	关联的对象（领导manager），影响性能，不推荐使用
		//方式二：使用当前用户名，重新查询当前用户信息，得到当前用户关联的对象（领导manager），用时查询，推荐使用
		//从web中获取Spring容器
		WebApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext()) ;
		//从spring容器中获取employeeService对象
		IEmployeeService eleEmployeeService = (IEmployeeService) ac.getBean("employeeService") ;
		//查询当前用户信息，并会将关联的领导对象查询出来
		Employee emp = eleEmployeeService.findEmployeeByName(name) ;
		//设置监听任务的办理人
		delegateTask.setAssignee(emp.getManager().getName()) ;
	}

}
